package com.global.dao.jdbc;

import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.CannotGetJdbcConnectionException;

import com.global.vo.DBColumn;
import com.global.vo.QueryParameter;

/**
 * 
 * @author zly601436
 *
 */
public interface GenericJdbcDao {
	
	/**
	 * 返回异常信息
	 * @return 返回异常信息
	 */
	public String getErrorMessage();
	
	/**
	 * 执行<span style="color:red">静态SQL</span>返回结果集
	 * @param staticSqlStr 静态SQL语句
	 * @return ResultSet
	 * @throws CannotGetJdbcConnectionException
	 * @throws SQLException
	 */
	public ResultSet getResultSet(String staticSqlStr) throws CannotGetJdbcConnectionException, SQLException;
	
	/**
	 * 执行<span style="color:red">静态SQL</span>返回结果集
	 * @param staticSql 静态SQL语句
	 * @return 行的 key-value 集合
	 */
	public List<Map<String, Object>> queryForList(String staticSql);

	/**
	 * 执行<span style="color:red">带命名参数(区分大小写)的SQL</span>返回结果集
	 * @param namedParameterSql 带命名参数的SQL
	 * @return 行的 key-value 集合
	 */
	public List<Map<String, Object>> queryForList(String namedParameterSql, List<QueryParameter> queryParameters);
	
	/**
	 * 执行<span style="color:red">带命名参数的SQL</span>返回结果集
	 * <br/>参数的顺序要与SQL中的命名参数顺序一致
	 * @param namedParameterSql  带命名参数的SQL，例如：Select * From Dba_All_Tables t Where t.Owner = :Owner
	 * @param namedParameterMap 参数以及对应的值
	 * @return
	 * @throws CannotGetJdbcConnectionException
	 * @throws SQLException
	 */
	public ResultSet getResultSet(String namedParameterSql, List<QueryParameter> queryParameters) throws CannotGetJdbcConnectionException, SQLException;
	
	/**
	 * 根据结果集返回对应的元数据（按照字段在Select语句中从左到右的顺序排列）
	 * @param resultSet
	 * @return 结果集返回对应的元数据（按照字段在Select语句中从左到右的顺序排列）
	 * @throws CannotGetJdbcConnectionException
	 * @throws SQLException
	 */
	public ResultSetMetaData getMetaData(ResultSet resultSet);
	
	/**
	 * 返回<span style="color:red">静态SQL</span>对应的元数据
	 * @param sqlStr 静态SQL
	 * @return 元数据（按照字段在Select语句中从左到右的顺序排列）
	 */
	public List<DBColumn> getStaticSQLMetaData(final String sqlStr);
	
	/**
	 * 返回<span style="color:red">带命名参数的SQL</span>对应的元数据
	 * <br/>参数的顺序要与SQL中的命名参数顺序一致
	 * @param namedParameterSqlStr 带命名参数的SQL
	 * @param namedParameters 命名参数清单
	 * @return 元数据
	 */
	public List<DBColumn> getNamedParameterSQLMetaData(final String namedParameterSqlStr, List<QueryParameter> namedParameters);
	
	/**
	 * 返回SQL对应的元数据（按照字段在Select语句中从左到右的顺序排列）
	 * @param resultSet
	 * @return SQL对应的元数据（按照字段在Select语句中从左到右的顺序排列）
	 * @throws CannotGetJdbcConnectionException
	 * @throws SQLException
	 */
	public List<DBColumn> getSQLMetaData(ResultSet resultSet);
	/**
	 * 获取数据库的当前时间
	 * @return
	 */
	public Date getDbCurrentDate();
	
	/**
	 * 获取数据库的元数据
	 * @return
	 * @throws CannotGetJdbcConnectionException
	 * @throws SQLException
	 */
	public DatabaseMetaData getDatabaseMetaData(); 
}